package fr.utbm.tx52.stamp.logic.utils;

import android.media.ExifInterface;
import android.util.Log;
import fr.utbm.tx52.stamp.logic.Constant;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;

/**
 * Classe permettant la manipulation des dates
 *
 * @author Julien GONZALVES (julien.gonzalves@utbm.fr) Laurent RUBY
 * (laurent.ruby@utbm.fr)
 */
public class DateUtil
{

	/**
	 * @param _file1 le fichier sur lequel r�cuperer la date
	 * @return la date contenue dans les Exif du fichier au format Calendar
	 */
	public static Calendar getCalendarDateViaExif(File _file1)
	{
		return convertExifStringDateToCalendarDate(getFileDateViaExif(_file1));
	}

	/**
	 * Permet de r�cup�rer la date d'une photo via Exif en r�cup�rant cette
	 * information dans les m�ta-donn�es
	 *
	 * @param _file le fichier sur lequel r�cuperer la date
	 * @return la date contenue dans les Exif du fichier au format String
	 * AAAA:MM:JJ HH:MM:SS (Exemple : 2008:02:18 05:07:31)
	 */
	private static String getFileDateViaExif(File _file)
	{
		String fileDate = Constant.EXIF_FILE_DATE_UNKNOWN;
		try
		{
			ExifInterface exifInterface = new ExifInterface(_file.getAbsolutePath());
			fileDate = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
		}
		catch (IOException e)
		{
			Log.e(DateUtil.class.getSimpleName(), "", e);
		}
		return fileDate;
	}

	/**
	 * @param _exifStringDate date au format String AAAA:MM:JJ HH:MM:SS �
	 * convertir en Calendar
	 * @return la date correspondant � _exifStringDate au format Calendar
	 */
	private static Calendar convertExifStringDateToCalendarDate(
		String _exifStringDate)
	{
		Calendar calendarDate = Calendar.getInstance();

		// Si la date existe
		if (_exifStringDate != null && !_exifStringDate.equals(Constant.EXIF_FILE_DATE_UNKNOWN))
		{

			// Extraction de l'ann�e
			int year = Integer.parseInt(_exifStringDate.substring(0, 4));

			// Extraction du mois en appliquant un -1 car avec l'objet Calendar, le mois 0 correspond � Janvier.
			int month = Integer.parseInt(_exifStringDate.substring(5, 7)) - 1; // 

			// Extraction du jour
			int day = Integer.parseInt(_exifStringDate.substring(8, 10));

			// Extraction de l'heure
			int hour = Integer.parseInt(_exifStringDate.substring(11, 13));

			// Extraction des minutes
			int minute = Integer.parseInt(_exifStringDate.substring(14, 16));

			// Extraction des secondes
			int second = Integer.parseInt(_exifStringDate.substring(17, 19));

			// Construction de la date � partir des donn�es r�cup�r�es
			calendarDate.set(year, month, day, hour, minute, second); // 
		}
		return calendarDate;
	}

	/**
	 * Permet de r�cup�rer la date d'un fichier et de retourner une chaine
	 * explicite. Il y a plusieurs modifications : String (ExifDate) -> Calendar
	 * (ExifCalendar) -> String (ExifCompleteDate)
	 *
	 * @param _file
	 * @return
	 */
	public static String getCompleteDate(File _file)
	{
		String fileDateViaExif = getFileDateViaExif(_file);
		Calendar calendarDate = convertExifStringDateToCalendarDate(fileDateViaExif);
		String completeDate = getCompleteDate(calendarDate);
		return completeDate;
	}

	/**
	 * Permet d'afficher proprement une date afin qu'elle soit lisible
	 * facilement
	 *
	 * @param _calendarDate la date au format Calendar � afficher
	 * @return
	 */
	private static String getCompleteDate(Calendar _calendarDate)
	{

		long year = _calendarDate.get(Calendar.YEAR);
		long month = _calendarDate.get(Calendar.MONTH);
		long day = _calendarDate.get(Calendar.DAY_OF_MONTH);
		long hour = _calendarDate.get(Calendar.HOUR);
		long minute = _calendarDate.get(Calendar.MINUTE);
		long second = _calendarDate.get(Calendar.SECOND);

		String completeDate = day + " " + getMonthName(month) + " " + year
			+ " à " + hour + "h" + minute + "m" + second + "s";

		return completeDate;
	}

	/**
	 * @param _month le num�ro du mois
	 * @return le mois correspondant au num�ro sous forme de String
	 */
	private static String getMonthName(long _month)
	{
		String monthText;
		switch ((int) _month)
		{
			case 0:
				monthText = "Janvier";
				break;
			case 1:
				monthText = "Février";
				break;
			case 2:
				monthText = "Mars";
				break;
			case 3:
				monthText = "Avril";
				break;
			case 4:
				monthText = "Mai";
				break;
			case 5:
				monthText = "Juin";
				break;
			case 6:
				monthText = "Juillet";
				break;
			case 7:
				monthText = "Aout";
				break;
			case 8:
				monthText = "Septembre";
				break;
			case 9:
				monthText = "Octobre";
				break;
			case 10:
				monthText = "Novembre";
				break;
			case 11:
				monthText = "Décembre";
				break;
			default:
				monthText = "Month unknown";
				break;
		}
		return monthText;
	}
}
